下面是最 基本 的 class , Person 是 這個 Class 的 Name,這個 class 並沒有 Constructor,
當我們並沒有要在 Constructor 傳入 參數,我們可以將 Constructor 省略了
class Person {
}
我們在 Person 後面 加上 Constructor "()"
Constructor 是一種特殊的 function(是這個 class 的 成員),他用來初始化這個 Class 的 新建 Object 的狀態/屬性。創建這個 class 的實例 (Object )時 會調用這個 function 。
class Person() {
}
我們可以在 Constructor 內傳入 我們需要的參數
class Person(name:String , gender:String) {
}
下面我們聲明了 Person 成員屬性(property), 其實說穿了,就只是
在class 內設的變數
class Person(name:String , gender:String) {
val _name:String = ""
val _gender:String = ""
}
下面我們在 class 建立了 Class 的 成員函數 (function) introduce ()
class Person(name:String , gender:String) {
var _name:String = ""
var _gender:String = ""
fun introduce (){
println("My name is $_name")
}
}
下面我們建立了 Person Object ,並讓 person 變數指向這個物件 ,我們將"Tom", "Male" 兩個字串傳給 Constructor 相對應 的 變數 ,"Tom"傳給 name 變數,"Male" 傳給gender 變數
val person = Person ("Tom","Male")
person 指向 Person型別(類別)建立的物件(Object) ,此時 person 會被判定型別(類別)是 Person,這個建立的物件(Object)可以調用 他的 成員函數 和 成員屬性
調用他的 成員函數 introduce ()
fun main (){
person.introduce()
// 對應 它的 introduce 函數 他會 打印出 My name is , 因為 _name 是空字串 ,
// 還沒有給值
}
調用他的 成員屬性 _name
fun main (){
// 調用他的 成員屬性 _name
val thisPersonName = person._name
// 就像一般變數一樣, 如果是 var 可以指向新的值
person._name = "Jamie"
}
在Kotlin中創建 Object 之前,需要定義一個class, class 就像 藍圖 , 而 Object 就像是要依這藍圖建立的房子。 它包含有關 Object 所有詳細信息。基於這些描述,我們建造了 Object 。 由於可以用相同的描述 建立其他的 Object ,因此我們可以根據一個class (BluePrint)創建許多 Object (House) 。
就像 下面 同一個 Person 類別可以建立 好幾個同類別的物件
val person1 = Person ("Adam","Male")
val person2 = Person ("Allan","")
val person3 = Person ("Alvin","")
Constructor 不能包含任何程式碼。因此,所有初始化邏輯都寫在 init block 內
,因此 init block 內的程式碼 是在 class 初始化階段 便會執行的區塊。
class Person (name:String , gender:String){
var _name:String = ""
var _gender:String = ""
init {
_name = name
_gender = gender
}
}
默認情況下,Class 是 final 並不能被繼承。要使一個類可繼承,需用 open keyword。
open class Bird (){
fun fly (){
println ("I m a bird , I can fly .")
}
下面示範如何繼承一個類別,Seagull 變成 Bird subtype
class Seagull ():Bird(){
}
subtype class 可以調用 supertype 的 function
fun main {
val seagull = Seagull ()
seagull.fly ()
// result :
// I m a bird , I can fly .
}
上面 Seagull () 並無法 複寫 Bird()的 fly function
必須在 fly funtion 也加上 open keyword ,fly
才能被覆寫
open class Bird (){
open fun fly (){
println ("I m a bird , I can fly .")
}
Seagull () 複寫 supertype Bird () 的 function fly ()
複寫 的 fun 要加上 override keyword
class Seagull ():Bird(){
override fun fly (){
println ("I m a seagull , I can fly .")
}
}
但不是所有的 class 都適合 繼承 , 需要符合 Subtype is Supertype
像上面 Seagull is Bird , Seagull 調用 fly () 是符合常理的
但如果 讓 Cat 類別 繼承 Bird 類別就不符合常理